<template>
  <div id="app">
    <div class="todo-container">
      <div class="todo-wrap">
        <!-- 使用组件 -->
        <!-- 使用自定义事件通信 （子传父）  -->
        <Header @addOneTodo="addOneTodo" :todos="todos"></Header>
        <!-- 动态传递App中的data的todos数据 -->
        <!-- 使用props通信  -->
        <Main :todos="todos" :updateOneTodo="updateOneTodo"  :deleteOneTodo="deleteOneTodo" ></Main>
        <!-- 使用自定义事件通信 （子传父）  -->
        <Footer :todos="todos" @checkedAll="checkedAll" @clearAllTodo="clearAllTodo"></Footer>
      </div>
    </div>
  </div>
</template>

<script>
import Main from '@/components/Main'
import Footer from '@/components/Footer'
import Header from '@/components/Header'

export default {
  name: 'App',
  // 注册组件
  // 哪里去使用 就在哪里注册
  components: {
    Header,
    Main,
    Footer,
  },
  // 数据设计的准则
  // 1.数据的格式 根据页面当中的使用来  数组套对象(通常情况)
  // 2.数据应该放在哪里?
  // 就看是某个组件要用还是某些组件要用 如果是某个组件要用 那么就直接放在这个组件的data数据中 如果是某些组件要用把数据放在这些组件的父组件中
  data(){
    return {
      // todos:[
      //   {id:1,content:'十点睡觉',isOver:false},
      //   {id:2,content:'写代码',isOver:true},
      //   {id:3,content:'做核酸',isOver:true},
      //   {id:4,content:'练帕梅拉',isOver:false},
      // ]
      todos:JSON.parse(localStorage.getItem('todos')) || 
      [
        {id:1,content:'十点睡觉',isOver:false},
        {id:2,content:'写代码',isOver:true},
        {id:3,content:'做核酸',isOver:true},
        {id:4,content:'练帕梅拉',isOver:false},
      ]
    }
  },
  methods:{
    // 头部添加一个todo
    addOneTodo(todo){
      // 在数组前面添加一条数据
      this.todos.unshift(todo)
    },
    // 修改单个选中状态
    updateOneTodo(id){
      // find返回查到到的符合条件的item
      const todo = this.todos.find(item=>item.id === id)
      todo.isOver = !todo.isOver
    },
    // 通过id删除单个todo
    deleteOneTodo(id){
      this.todos  = this.todos.filter(item => item.id !== id)
    },
    // 全选全不选
    checkedAll(flag){
      this.todos.map(item => item.isOver = flag)
    },
    // 清除已完成
    clearAllTodo(){
      this.todos = this.todos.filter(item => item.isOver !== true)
    }
  },
  watch:{
    todos:{
      handler(newVal,oldVal){
        // 本地储存
        localStorage.setItem('todos',JSON.stringify(newVal))
      },
      deep:true
    }
  }
}
</script>

<style scoped>

/*app*/
.todo-container {
  width: 600px;
  margin: 0 auto;
}
.todo-container .todo-wrap {
  padding: 10px;
  border: 1px solid #ddd;
  border-radius: 5px;
}

</style>
